iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0
自我挑戰組

高中生也可以!利用強化學習讓機器人動起來!系列 第 16

D16:URDF實作&強化學習環境設計

  • 分享至 

  • xImage
  •  

自從開賽後也過了一半了,我還蠻驚訝三分鐘熱度的我可以堅持到這。接下來只差把剩下另一半完成了,在打這段話的同時,程式也馬不停蹄的在訓練呢!希望一切順利~在這15天我也感覺到每一天都很充實,接下來剩下來的15天我敢說一定會是更大的挑戰。希望各位可以跟我一起度過剩下的15天喔。那經過了昨天的洗禮後,各位應該也更瞭解該如何創造自己的模型了,那今天會設計兩個物件,我會先介紹接下來整個強化學習設計的思路,再將此思路中會使用到的物件給實現出來。

正如我第一天提到的(感覺好遙遠),我打算建立一個可以讓機器人前進、轉彎的模型,其中為了方便視覺化會建立起一個目標點,接下來會建立起一道圍牆,基本上就是這兩個物件了,怕太多物件會影響執行速度。那就先來建立這兩個物件吧。

強化學習環境物件

以下是我這次專案的設計,目標點(target)會隨機刷新,而目標上會有一束雷射偵測R2D2是否有成功走到那邊去。另外如果跑太遠到圍牆那邊就算任務失敗。

繪圖3.png

目標點

目標點是一個圓,但因為預設中沒有圓,只能使用圓柱<cylinder>,然後也因為這個純粹是方便觀察用的,所以也不會設定碰撞,並且質量設定為0,不然他會穿過地板掉到下面去。

<robot name="target">
    <link name="baseLink">
        <contact>
          <lateral_friction value="1.0"/>
        </contact>
        <inertial>
          <origin rpy="0 0 0" xyz="0 0 0"/>
           <mass value="0.0"/>
           <inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
        </inertial>
        <visual>
          <origin rpy="0 0 0" xyz="0 0 0"/>
          <geometry>
           <cylinder radius="0.1" length="0.05"/>
          </geometry>
           <material name="yellow">
            <color rgba="1 1 .1 1"/>
          </material>
        </visual>
    </link>
</robot>

可以看到結果如下,一個小小的圓形。

d15-1.png

圍牆

很簡單,就是四片長方體組合而成的圍牆。不過有個大致的設計方向,通常我會習慣畫個設計圖,這樣在設定相對位置等會比較輕鬆。

<robot name="wall">
    <link name="front">
        <contact>
            <lateral_friction value="1.0"/>
        </contact>
        <inertial>
            <origin rpy="0 0 0" xyz="5 0 0"/>
            <mass value="1000.0"/>
            <inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
        </inertial>
        <visual>
            <origin rpy="0 0 0" xyz="5 0 0"/>
            <geometry>
                <box size="0.1 10 1"/>
            </geometry>
            <material name="brown">
                <color rgba="0.82 0.54 0.39 1"/>
            </material>
        </visual>
        <collision>
            <origin rpy="0 0 0" xyz="5 0 0"/>
            <geometry>
                <box size="0.1 10 1"/>
            </geometry>
        </collision>
    </link>
    <link name="back">
        <contact>
            <lateral_friction value="1.0"/>
        </contact>
        <inertial>
            <origin rpy="0 0 0" xyz="-5 0 0"/>
            <mass value="1000.0"/>
            <inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
        </inertial>
        <visual>
            <origin rpy="0 0 0" xyz="-5 0 0"/>
            <geometry>
                <box size="0.1 10 1"/>
            </geometry>
            <material name="brown">
                <color rgba="0.82 0.54 0.39 1"/>
            </material>
        </visual>
        <collision>
            <origin rpy="0 0 0" xyz="-5 0 0"/>
            <geometry>
                <box size="0.1 10 1"/>
            </geometry>
        </collision>
    </link>
    <link name="left">
        <contact>
            <lateral_friction value="1.0"/>
        </contact>
        <inertial>
            <origin rpy="0 0 0" xyz="0 5 0"/>
            <mass value="1000.0"/>
            <inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
        </inertial>
        <visual>
            <origin rpy="0 0 0" xyz="0 5 0"/>
            <geometry>
                <box size="10 0.1 1"/>
            </geometry>
            <material name="brown">
                <color rgba="0.82 0.54 0.39 1"/>
            </material>
        </visual>
        <collision>
            <origin rpy="0 0 0" xyz="0 5 0"/>
            <geometry>
                <box size="10 0.1 1"/>
            </geometry>
        </collision>
    </link>
    <link name="right">
        <contact>
            <lateral_friction value="1.0"/>
        </contact>
        <inertial>
            <origin rpy="0 0 0" xyz="0 -5 0"/>
            <mass value="1000.0"/>
            <inertia ixx="0" ixy="0" ixz="0" iyy="0" iyz="0" izz="0"/>
        </inertial>
        <visual>
            <origin rpy="0 0 0" xyz="0 -5 0"/>
            <geometry>
                <box size="10 0.1 1"/>
            </geometry>
            <material name="brown">
                <color rgba="0.82 0.54 0.39 1"/>
            </material>
        </visual>
        <collision>
            <origin rpy="0 0 0" xyz="0 -5 0"/>
            <geometry>
                <box size="10 0.1 1"/>
            </geometry>
        </collision>
    </link>
    
    <joint name="j1" type="fixed">
        <parent link="front"/>
        <child link="left"/>
    </joint>
    <joint name="j2" type="fixed">
        <parent link="left"/>
        <child link="back"/>
    </joint>
    <joint name="j3" type="fixed">
        <parent link="back"/>
        <child link="right"/>
    </joint>
</robot>

d15-2.png

可以看到一個10格寬的大圍牆,這樣應該有很多空間可以使用。

基本上簡單的幾何圖形組合成的物件我都會直接用寫的把它寫出來,如果是複雜一點的話通常就用blender或者solidworks畫出3D圖形來,再轉檔案成urdf,或者自己寫然後用前一天介紹的mesh匯入3D圖形。不過要注意pybullet中一個格子是1公尺,所以比例尺要處理一下,或者在寫urdf的時候注意縮放。有一些函式庫(例如object2urdf,連結會在下面)也可以幫助你將.stl或者.obj轉換成urdf,各位有興趣可以再去底下這個網站看看~

結語

今天實際操作了一次製作urdf的過程,也有一些示例,雖然內容偏少orz,在寫這個檔案的時候我真的覺得蠻有趣的,寫的過程像在設計一個簡單的網頁,但出來的成果卻截然不同,寫了幾次都還是感覺很新奇。題外話從開始認真學程式設計也快兩年了,最近也想學javascript,希望到時候不會爆肝,我還想活久一點,寫多一點小東西出來玩玩啊。

參考資料、網址

https://pypi.org/project/object2urdf/


上一篇
D15:URDF語法
下一篇
D17:自定義環境(1/2)
系列文
高中生也可以!利用強化學習讓機器人動起來!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言